#include <iostream>
#include "MYVideoThread.h"
#include "MYDecode.h"

using namespace std;

// 打开解码器，不管成功与否都清理
bool MYVideoThread::Open(AVCodecParameters *para, IVideoCall *call, int width, int height)
{
    if(!para) return false;
    // 清理解码的任务队列
    Clear();

    vmux.lock();
    synpts = 0;
    // 初始化显示窗口
    this->call = call;
    vmux.unlock();

    int ret = true;
    // 打开解码器
    if(!decode->Open(para)) {
        cout << "audio MYDecode open failed!" << endl;
        ret = false;
    }

    cout << "MYAudioThread::Open :" << ret << endl;
    return ret;
}

// 暂停
void MYVideoThread::SetPause(bool isPause)
{
    vmux.lock();
    this->isPause = isPause;
    vmux.unlock();
}

void MYVideoThread::run()
{
    while(!isExit) {
        vmux.lock();
        if(this->isPause) {
            vmux.unlock();
            msleep(5);
            continue;
        }

        // 音视频同步 让视频解码慢一点
        if(synpts > 0 && synpts < decode->pts) {
            vmux.unlock();
            msleep(1);
            continue;
        }

        AVPacket *pkt = Pop();

        bool ret = decode->Send(pkt);
        if(!ret) {
            vmux.unlock();
            msleep(1);
            continue;
        }
        // 一次send， 多次recv
        while(!isExit) {
            AVFrame *frame = decode->Recv();
            if(!frame) break;
            if(call) call->Repaint(frame);
        }
        vmux.unlock();
    }
}

// 解码pts，如果接受到的解码数据pts > seekpts 返回true  并且显示画面
// 用于跳转到某个时刻的帧，因为跳转时任务队列中肯定还有其他未处理完的，需要处理完再处理新的
bool MYVideoThread::RepaintPts(AVPacket *pkt, long long seekpts)
{
    vmux.lock();
    bool ret = decode->Send(pkt);
    if(!ret) {
        vmux.unlock();
        return true;   //表示结束解码
    }
    AVFrame *frame = decode->Recv();
    if (!frame)
    {
        vmux.unlock();
        return false;
    }
    // 到达位置
    if(decode->pts >= seekpts) {
        if(call) call->Repaint(frame);
        vmux.unlock();
        return true;
    }
    MYFreeFrame(&frame);
    vmux.unlock();
    return false;
}

MYVideoThread::MYVideoThread()
{

}

MYVideoThread::~MYVideoThread()
{

}

